#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>
#include <stdlib.h>

//int main()
//{
//	int a = 10;//变量
//	int arr[10];//数组
//	
//	return 0;
//}



//int main()
//{
//	//int arr[10];
//	int* p = (int*)malloc(40);
//
//	if (NULL == p)
//	{
//		perror("malloc");
//		return 1;
//	}
//
//	//开辟成功
//	int i = 0;
//
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d\n", *(p + i));
//	}
//
//	free(p);//把p所指向的这块空间释放了
//	p = NULL;//避免p变成野指针
//
//	//int a = 10;
//	//int* ptr = &a;
//	//free(ptr);//err
//
//	return 0;
//}



//int main()
//{
//	int* p = (int*)calloc(10, sizeof(int));
//
//	if (NULL == p)
//	{
//		perror("calloc");
//		return 1;
//	}
//
//	//打印数据
//	int i = 0;
//
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", p[i]);
//	}
//
//	//释放
//	free(p);
//	p = NULL;
//
//	return 0;
//}



//int main()
//{
//	int* p = (int*)calloc(INT_MAX, sizeof(int));
//
//	if (NULL == p)
//	{
//		perror("calloc");
//		return 1;
//	}
//
//	//打印数据
//	int i = 0;
//
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", p[i]);
//	}
//
//	//释放
//	free(p);
//	p = NULL;
//
//	return 0;
//}




//int main()
//{
//	int* p = (int*)malloc(40);
//
//	if (NULL == p)
//	{
//		perror("malloc");
//		return 1;
//	}
//
//	//初始化为1～10
//	int i = 0;
//
//	for (i = 0; i < 10; i++)
//	{
//		p[i] = i + 1;
//	}
//
//	//增加一些空间
//	int* ptr = (int*)realloc(p, 80);//这里不能直接用p来接收，因为如果增容失败返回空指针，那么p原来所指向的40个字节的空间也找不到了，这40个字节我既用不到它也找不到它，导致了内存泄漏
//
//	if (ptr != NULL)
//	{
//		p = ptr;
//		ptr = NULL;
//	}
//	else
//	{
//		perror("realloc");
//		return 1;
//	}
//
//	//打印数据
//	for (i = 0; i < 20; i++)
//	{
//		printf("%d\n", p[i]);
//	}
//
//	//释放
//	free(p);
//	p = NULL;
//
//	return 0;
//}


//int main()
//{
//	int* p = (int*)malloc(40);
//
//	if (NULL == p)
//	{
//		perror("malloc");
//		return 1;
//	}
//
//	int i = 0;
//	//对动态开辟空间的越界访问
//	for (i = 0; i < 20; i++)
//	{
//		p[i] = i;//越界访问
//	}
//	
//	free(p);
//	p = NULL;
//
//	return 0;
//}


//3. 对非动态开辟内存使用free释放
//int main()
//{
//	int a = 10;
//	int* p = &a;
//	printf("%d\n", *p);
//
//	free(p);
//	p = NULL;
//
//	return 0;
//}


//4. 使用free释放一块动态开辟内存的一部分
//int main()
//{
//	int* p = (int*)malloc(40);
//
//	if (NULL == p)
//	{
//		perror("malloc");
//		return 1;
//	}
//
//	int i = 0;
//
//	for (i = 0; i < 5; i++)
//	{
//		*p = i;
//		p++;
//	}
//
//	//释放
//	free(p);
//	p = NULL;
//
//	return 0;
//}



//5. 对同一块动态内存多次释放
//int main()
//{
//	int* p = (int*)malloc(40);
//
//	if (NULL == p)
//	{
//		return 1;
//	}
//
//	//使用
//
//	//释放
//	free(p);
//	free(p);//err
//	p = NULL;
//
//	return 0;
//}

//int main()
//{
//	int* p = (int*)malloc(40);
//
//	if (NULL == p)
//	{
//		return 1;
//	}
//
//	//使用
//
//	//释放
//	free(p);
//	p = NULL;
//
//	free(p);//这样写没有问题，因为p为空指针时，free什么都不干
//
//	return 0;
//}



void test()
{
	int* p = (int*)malloc(100);
	
	if (NULL != p)
	{
		*p = 20;
	}
}

int main()
{
	test();

	while (1);

	return 0;
}